home *** CD-ROM | disk | FTP | other *** search
- #define DEBUG
- #include <debug.h>
-
- #include "backfill.h"
- #include "mp.h"
- #include <proto/cybergraphics.h>
- #include <graphics/gfx.h>
-
- extern BOOL V39;
-
- static void __saveds __asm RGB_BackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM);
- static void __saveds __asm RGB_CyberGfxBackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM);
-
- struct RGB_BackfillHook
- {
- struct Hook rgb_Hook;
- struct Screen *rgb_Screen;
- BOOL rgb_UseCyberGfx;
- LONG rgb_Pen;
- };
-
- struct Hook *RGB_AllocBackfillHook(struct Screen *Scr, struct DefaultNode *DN)
- {
- struct RGB_BackfillHook *b;
-
- if(V39)
- {
- if(b=AllocVec(sizeof(*b),MEMF_CLEAR|MEMF_PUBLIC))
- {
- if(GetBitMapAttr(Scr->RastPort.BitMap,BMA_DEPTH) >8 )
- {
- if(CyberGfxBase)
- {
- /* Since it is >8 bits */
- b->rgb_UseCyberGfx=IsCyberModeID( GetVPModeID(&Scr->ViewPort) );
- }
- }
-
- if(b->rgb_UseCyberGfx)
- {
- b->rgb_Pen=(DN->BackdropRGB.Red & 0xff000000)>>8 |
- (DN->BackdropRGB.Green & 0xff000000)>>16 |
- (DN->BackdropRGB.Blue & 0xff000000)>>24;
- b->rgb_Hook.h_Entry = (ULONG (*)())RGB_CyberGfxBackfillFunc;
- return((struct Hook *)b);
- }
- else
- {
- if(-1!=(b->rgb_Pen=ObtainBestPen(Scr->ViewPort.ColorMap,DN->BackdropRGB.Red,DN->BackdropRGB.Green,DN->BackdropRGB.Blue,0)))
- {
- b->rgb_Screen=Scr;
- b->rgb_Hook.h_Entry = (ULONG (*)())RGB_BackfillFunc;
- return((struct Hook *)b);
- }
- }
- FreeVec(b);
- }
- }
- return(0);
- }
-
- void RGB_FreeBackfillHook(struct Hook *Hook)
- {
- struct RGB_BackfillHook *bf;
-
- bf=(struct RGB_BackfillHook *)Hook;
-
- if(!bf->rgb_UseCyberGfx)
- ReleasePen(bf->rgb_Screen->ViewPort.ColorMap,bf->rgb_Pen);
- FreeVec(bf);
- }
-
- static void __saveds __asm RGB_BackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM)
- {
- struct RastPort rp;
-
- rp = *RP; // copy the rastport
- rp.Layer = NULL; // eliminate bogus clipping from our copy
-
- SetAPen(&rp,BF->rgb_Pen);
- RectFill(&rp,BFM->Bounds.MinX,BFM->Bounds.MinY,BFM->Bounds.MaxX,BFM->Bounds.MaxY);
- }
-
- static void __saveds __asm RGB_CyberGfxBackfillFunc(register __a0 struct RGB_BackfillHook *BF,register __a2 struct RastPort *RP,register __a1 struct BackFillMsg *BFM)
- {
- struct RastPort rp;
-
- rp = *RP; // copy the rastport
- rp.Layer = NULL; // eliminate bogus clipping from our copy
-
- FillPixelArray(&rp,BFM->Bounds.MinX,BFM->Bounds.MinY,BFM->Bounds.MaxX-BFM->Bounds.MinX+1,BFM->Bounds.MaxY-BFM->Bounds.MinY+1,BF->rgb_Pen);
- }
-
-